package cn.com.yang.ocr;

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;

/**
 * @Author 杨亿金
 * @Date 2021/7/27 11:43
 * @CopyRight
 * @Version
 */
public class TestSetup {
    //定义 OpenCV 动态链接库的引用路径，修改成实际路径
    private final static String OPENCV_DLL_PATH = "D:\\迅雷下载\\opencv\\build\\java\\x64\\opencv_java453.dll";

    static {
//        URL url = ClassLoader.getSystemResource("lib/opencv_java453.dll");
//        System.load(url.getPath());
        //加载动态链接库
        System.load(OPENCV_DLL_PATH);
    }

    /**
     * Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x2036316d020, dataAddr=0x2036315aa80 ]
     * isCont属性告诉我们在表示图像时，次矩阵是否使用了额外的填充，以便在某些平台上可以硬件加速。
     * isSubmat属性是指该矩阵是否是从另一个矩阵创建而来的，以及它是否引用了另一个矩阵的数据。
     * @param args
     */
    public static void main(String[] args) {
        //打印OpenCV的版本
        System.out.println("OpenCV : " + Core.VERSION);

        Mat m = new Mat(5,10, CvType.CV_8UC1,new Scalar(0));
        System.out.println("OpenCV Mat: "+m);
        Mat mr1 = m.row(1);
        mr1.setTo(new Scalar(1));
        Mat mc5 = m.col(5);
        mc5.setTo(new Scalar(5));
        System.out.println("OpenCV Mat data:\n"+m.dump());



        Mat image = new Mat(new Size(3,3),CvType.CV_8UC3,new Scalar(new double[] {3,6,9}));
        System.out.println("OpenCV Mat image data:\n"+image.dump()+"\n");

        /**
         * 在这里byte[]数值中，1代表通道蓝，2代表通道绿，3代表通道红，即顺序是{蓝，绿，黄}
         */
        for(int i=0;i<image.rows();i++) {
            for(int j=0;j<image.cols();j++) {
                image.put(i, j, new byte[] {2,4,8});
            }
        }

        readFile("F:\\1234.png");
    }

    /**
     * 过滤器，将通道蓝的数值滤去，置为0
     * @param image
     * @return
     */
    public static Mat filter(Mat image) {
        Mat newImage=image;
        //得到图像中的字节数
        int totalBytes = (int)(newImage.total() * newImage.elemSize());
        //image.total()得到像素总数，image.elemSize()得到每个元素的大小，单位byte
        System.out.println("totalBytes:"+totalBytes);

        byte buffer[] = new byte[totalBytes];
        //get，put方法分别是将byte转换成Mat，将Mat转换成byte
        for(int i=0;i<totalBytes;i++) {
            if(i%3==0) {  //通道蓝为3的倍数
                buffer[i]=0;  //置为0
            }
        }
        newImage.put(0, 0, buffer);
        System.out.println("put:"+newImage.dump());
        return newImage;
    }

    /**
     *
     */
    public static void readFile(String fileName){
        Mat src = Imgcodecs.imread(fileName);  //读入一幅图像
        if(src.empty()) {
            System.out.println("empty");
            return;
        } else {  //判断确实读入
            System.out.println("Notempty");
            Mat newImage = filter(src); //调用过滤器
            Imgcodecs.imwrite("F:\\newfavcion.jpg", newImage);  //将得到新的图像写入文件中
        }

    }
}
